#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>

#include "thread1.h"
#include "thread2.h"
#include "thread3.h"
#include "thread4.h"
#include "thread5.h"
#include "thread6.h"
#include "thread7.h"
#include "thread10.h"
#include "thread11.h"
#include "thread12.h"
#include "msg_queue.h"
#include "gpio_lib.h"
#include "log_utils.h"
#include "log_service.h"

// 全局变量
int g_running = 1;  // 程序运行标志

// 信号处理函数
void signal_handler(int sig) {
    LOG_INFO(LOG_TO_FILE, LOG_MODULE_MAIN, "接收到信号 %d，程序准备退出", sig);
    exit(0);
}

int main(int argc, char *argv[]) {
    pthread_t tid1, tid2, tid4, tid5, tid6, tid11, tid12;
    pthread_t tid_logsvc; // 新增：日志服务线程
    int ret;
    
    // 初始化日志系统
    if (log_init() != 0) {
        LOG_FATAL(LOG_TO_FILE, LOG_MODULE_MAIN, "日志系统初始化失败");
        return -1;
    }
    
    // 设置日志级别（默认为DEBUG，方便调试）
    // 可以通过命令行参数覆盖默认设置
    log_set_level(LOG_LEVEL_DEBUG);  // 默认DEBUG级别
    
    // 解析命令行参数
    for (int i = 1; i < argc; i++) {
        if (strcmp(argv[i], "trace") == 0) {
            log_set_level(LOG_LEVEL_TRACE);
        } else if (strcmp(argv[i], "debug") == 0) {
            log_set_level(LOG_LEVEL_DEBUG);
        } else if (strcmp(argv[i], "info") == 0) {
            log_set_level(LOG_LEVEL_INFO);
        } else if (strcmp(argv[i], "warn") == 0) {
            log_set_level(LOG_LEVEL_WARN);
        } else if (strcmp(argv[i], "error") == 0) {
            log_set_level(LOG_LEVEL_ERROR);
        } else if (strcmp(argv[i], "fatal") == 0) {
            log_set_level(LOG_LEVEL_FATAL);
        } else if (strcmp(argv[i], "--console-auto") == 0) {
            log_set_console_mode(LOG_CONSOLE_AUTO);
        } else if (strcmp(argv[i], "--console-on") == 0) {
            log_set_console_mode(LOG_CONSOLE_FORCE_ON);
        } else if (strcmp(argv[i], "--console-off") == 0) {
            log_set_console_mode(LOG_CONSOLE_FORCE_OFF);
        } else if (strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "-h") == 0) {
            printf("用法: %s [选项]\n", argv[0]);
            printf("日志级别选项:\n");
            printf("  trace    - 跟踪级别（最详细）\n");
            printf("  debug    - 调试级别（默认）\n");
            printf("  info     - 信息级别\n");
            printf("  warn     - 警告级别\n");
            printf("  error    - 错误级别\n");
            printf("  fatal    - 致命错误级别（最少输出）\n");
            printf("控制台输出选项:\n");
            printf("  --console-auto  - 自动检测（默认，后台运行时禁用控制台输出）\n");
            printf("  --console-on    - 强制启用控制台输出\n");
            printf("  --console-off   - 强制禁用控制台输出\n");
            printf("其他选项:\n");
            printf("  --help, -h      - 显示此帮助信息\n");
            return 0;
        }
    }
    
    LOG_INFO(LOG_TO_FILE, LOG_MODULE_MAIN, "LD_ICM程序启动");

    // 新增：尽早启动日志服务线程，避免UDP日志无人接收
    ret = pthread_create(&tid_logsvc, NULL, log_service_function, NULL);
    if (ret != 0) {
        LOG_FATAL(LOG_TO_CONSOLE_ONLY, LOG_MODULE_MAIN, "日志服务线程创建失败: %s", strerror(ret));
        return -1;
    }
    
    // 设置信号处理
    signal(SIGINT, signal_handler);
    signal(SIGTERM, signal_handler);
    
    // 注册日志服务信号处理
    register_signal_handlers();
    
    // 初始化GPIO库清理处理函数
    gpio_register_cleanup_handlers();
    
    // 初始化消息队列（在创建线程前）
    LOG_DEBUG(LOG_TO_CONSOLE_ONLY, LOG_MODULE_MSGQ, "初始化消息队列...");
    g_msg_queue_id = init_msg_queue(MSG_QUEUE_KEY);
    if (g_msg_queue_id < 0) {
        LOG_FATAL(LOG_TO_FILE, LOG_MODULE_MSGQ, "消息队列初始化失败，程序退出");
        return -1;
    }
    LOG_INFO(LOG_TO_FILE, LOG_MODULE_MSGQ, "消息队列初始化成功，ID: %d", g_msg_queue_id);
    
    // 初始化线程10的读写锁
    if (pthread_rwlock_init(&g_sensor_snapshot_rwlock, NULL) != 0) {
        LOG_FATAL(LOG_TO_FILE, LOG_MODULE_MAIN, "线程10读写锁初始化失败，程序退出");
        return -1;
    }
    LOG_INFO(LOG_TO_FILE, LOG_MODULE_MAIN, "线程10读写锁初始化成功");
    
    // 创建12个线程
    LOG_INFO(LOG_TO_FILE, LOG_MODULE_MAIN, "正在创建工作线程...");
    
    ret = pthread_create(&tid1, NULL, thread1_function, NULL);
    if (ret != 0) {
        LOG_FATAL(LOG_TO_FILE, LOG_MODULE_MAIN, "线程1创建失败: %s", strerror(ret));
        exit(EXIT_FAILURE);
    }
    
    ret = pthread_create(&tid2, NULL, thread2_function, NULL);
    if (ret != 0) {
        LOG_FATAL(LOG_TO_FILE, LOG_MODULE_MAIN, "线程2创建失败: %s", strerror(ret));
        exit(EXIT_FAILURE);
    }
    /*
    ret = pthread_create(&tid3, NULL, thread3_function, NULL);
    if (ret != 0) {
        LOG_ERROR(LOG_TO_FILE, LOG_MODULE_MAIN, "线程3创建失败: %s", strerror(ret));
        exit(EXIT_FAILURE);
    }
    */
   
    ret = pthread_create(&tid4, NULL, thread4_function, NULL);
    if (ret != 0) {
        LOG_FATAL(LOG_TO_FILE, LOG_MODULE_MAIN, "线程4创建失败: %s", strerror(ret));
        exit(EXIT_FAILURE);
    }
    
    ret = pthread_create(&tid5, NULL, thread5_function, NULL);
    if (ret != 0) {
        LOG_FATAL(LOG_TO_FILE, LOG_MODULE_MAIN, "线程5创建失败: %s", strerror(ret));
        exit(EXIT_FAILURE);
    }
    
    
    ret = pthread_create(&tid6, NULL, thread6_function, NULL);
    if (ret != 0) {
        LOG_ERROR(LOG_TO_FILE, LOG_MODULE_MAIN, "线程6创建失败: %s", strerror(ret));
        exit(EXIT_FAILURE);
    }
    
    /*
    ret = pthread_create(&tid7, NULL, thread7_function, NULL);
    if (ret != 0) {
        LOG_ERROR(LOG_TO_FILE, LOG_MODULE_MAIN, "线程7创建失败: %s", strerror(ret));
        exit(EXIT_FAILURE);
    }
    */
    /*
    ret = pthread_create(&tid8, NULL, thread8_function, NULL);
    if (ret != 0) {
        LOG_FATAL(LOG_TO_FILE, LOG_MODULE_MAIN, "线程8创建失败: %s", strerror(ret));
        exit(EXIT_FAILURE);
    }
    */

    /*
    ret = pthread_create(&tid9, NULL, thread9_function, NULL);
    if (ret != 0) {
        LOG_FATAL(LOG_TO_FILE, LOG_MODULE_MAIN, "线程9创建失败: %s", strerror(ret));
        exit(EXIT_FAILURE);
    }
    */
    
    /*
    // 创建线程10 - 传感器数据采集线程
    ret = pthread_create(&tid10, NULL, thread10_function, NULL);
    if (ret != 0) {
        LOG_FATAL(LOG_TO_FILE, LOG_MODULE_MAIN, "线程10创建失败: %s", strerror(ret));
        exit(EXIT_FAILURE);
    }
    */
    
    ret = pthread_create(&tid11, NULL, thread11_function, NULL);
    if (ret != 0) {
        LOG_FATAL(LOG_TO_FILE, LOG_MODULE_MAIN, "线程11创建失败: %s", strerror(ret));
        exit(EXIT_FAILURE);
    }
    
    ret = pthread_create(&tid12, NULL, thread12_function, NULL);
    if (ret != 0) {
        LOG_FATAL(LOG_TO_FILE, LOG_MODULE_MAIN, "线程12创建失败: %s", strerror(ret));
        exit(EXIT_FAILURE);
    }
    
    LOG_INFO(LOG_TO_FILE, LOG_MODULE_MAIN, "所有线程已创建完成");
    
    // 等待传感器线程完全启动，避免启动阶段的传感器数据超时警告
    LOG_INFO(LOG_TO_FILE, LOG_MODULE_MAIN, "等待传感器线程启动完成...");
    sleep(2);  // 等待2秒让传感器线程完全启动
    LOG_INFO(LOG_TO_FILE, LOG_MODULE_MAIN, "传感器线程启动完成，开始数据采集");
    
    // 等待所有线程结束（实际上永远不会结束，除非手动终止程序）
    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);
    //pthread_join(tid3, NULL);
    pthread_join(tid4, NULL);
    pthread_join(tid5, NULL);
    pthread_join(tid6, NULL);
    //pthread_join(tid7, NULL);
    //pthread_join(tid8, NULL);
    //pthread_join(tid9, NULL);
    //pthread_join(tid10, NULL);
    pthread_join(tid11, NULL);
    pthread_join(tid12, NULL);
    
    // 新增：等待日志服务线程结束
    pthread_join(tid_logsvc, NULL);
    
    // 清理日志系统
    log_cleanup();
    
    return 0;
} 